package prh25.biblioteca.service;

import java.util.List;

import prh25.biblioteca.entity.Documento;
import prh25.biblioteca.entity.Professor;
import prh25.biblioteca.entity.Usuario;
import prh25.biblioteca.entity.UsuarioExterno;
import prh25.biblioteca.entity.dao.UsuarioDAO;
import prh25.biblioteca.entity.dao.UsuarioExternoDAO;
import prh25.biblioteca.entity.dao.hibernate.HibernateDAOFactory;
import prh25.biblioteca.entity.dao.hibernate.HibernateUtil;
import prh25.biblioteca.service.exception.RestricaoIntegridadeException;
import prh25.biblioteca.service.exception.UsuarioExistenteException;

public class UsuarioExternoServiceImpl implements UsuarioExternoService {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private UsuarioExternoDAO usuarioExternoDAO;
	
	@Override
	/**
	 * Salva um usuario externo no banco de dados.
	 * @param usuario externo a ser salvo no banco de dados.
	 */
	public Integer criar(UsuarioExterno usuarioExterno) {
		
		usuarioExterno.getEndereco().uid();
		
		
		usuarioExternoDAO = HibernateDAOFactory.DEFAULT.buildUsuarioExternoDAO();

		// Inicio da transacao

		try {
			HibernateUtil.beginTransaction();
			usuarioExternoDAO.saveOrUpdate(usuarioExterno);
			HibernateUtil.commitTransaction();
		} catch (Exception ex) {
			ex.printStackTrace();
			HibernateUtil.rollbackTransaction();
			// Aqui deve ser adiconada o url de aviso de erro
		}finally{
			HibernateUtil.getSession().flush();
			HibernateUtil.getSession().clear();
		}
		
		return usuarioExterno.getId();
	}
	
	/**
	 * Verifica se o usuario externo a ser inserido no banco de dados jah existe.
	 * @param usuarioExterno - usuario externo a ser inserido.
	 */
	private void checkDuplicidade(UsuarioExterno usuarioExterno) {
		UsuarioDAO usuarioDAO = HibernateDAOFactory.DEFAULT.buildUsuarioDAO();
		
		List<Usuario> logins = usuarioDAO.findByLogin(usuarioExterno.getLogin());
		
		if (!logins.isEmpty()) 
			throw new UsuarioExistenteException("Usuario ja existe");
	}
	
	@Override
	/**
	 * Salva um arquivo no banco de dados.
	 * @param documento - Documento a ser salvo no banco de dados.
	 * @param diretorioAplicacao - diretorio onde se encontra o arquivo.
	 * @return True se o arquivo foi salvo com sucesso, false caso contrario.
	 */
	public boolean finalizarEnvioArquivo(Documento documento, String diretorioAplicacao) {
		DocumentoService servico = new DocumentoServiceImpl();
		return servico.finalizarEnvioArquivo(documento, diretorioAplicacao);
	}

}
